home *** CD-ROM | disk | FTP | other *** search
/ Visual Basic Source Code / Visual Basic Source Code.iso / vbsource / optivc32 / cdmath.h < prev    next >
C/C++ Source or Header  |  1999-03-06  |  15KB  |  450 lines

  1. /*    CDMATH.H
  2.  
  3.       Complex library for the languages C and C++.
  4.  
  5.       This header file contains all definitions for
  6.       double-precision complex numbers (complex double).
  7.  
  8.       Copyright (C) 1996-1999 Martin Sander
  9.       Address of the author:
  10.            Dr. Martin Sander Software Dev.
  11.            Sertuernerstr. 11
  12.            D-37085 Goettingen
  13.            Germany
  14.            MartinSander@Bigfoot.com
  15.            http://www.optivec.com
  16. */
  17.  
  18.  
  19. #ifndef __CDMATH_H
  20. #define __CDMATH_H
  21.  
  22. #if !defined( _CMATH_DEFS )
  23.    #ifdef __BORLANDC__
  24.        #pragma option -a-
  25.    #else /* Visual C++, Optima++ */
  26.        #pragma pack( push,1 )
  27.    #endif /* avoid insertion of dummy bytes  */
  28.    typedef struct {float    Re, Im;} fComplex;
  29.    typedef struct {double   Re, Im;} dComplex;
  30.    #ifdef __BORLANDC__
  31.        typedef long double    extended;
  32.        typedef struct {extended Re, Im;} eComplex;
  33.        #pragma option -a.
  34.    #else /* Visual C++, Optima++ */
  35.        typedef  double extended; /* Visual C++ does not support
  36.                                  80-bit IEEE numbers. So make
  37.                                  extended equal to double    */
  38.        typedef dComplex  eComplex;
  39.        #pragma pack( pop )
  40.    #endif    /* restore default data packing  */
  41.    typedef fComplex fcomplex;
  42.    typedef dComplex dcomplex;
  43.    typedef eComplex ecomplex;  // tolerate all-minuscule
  44.    #define _CMATH_DEFS
  45. #endif
  46. #ifdef __BORLANDC__
  47.     #include <_defs.h>
  48.     #if defined __TINY || defined __SMALL__ || defined __MEDIUM__
  49.         #if defined(_RTLDLL) || defined(_CLASSDLL)
  50.             #error Must use static BC Runtime Library with OptiVec and CMATH in models TINY, SMALL, MEDIUM
  51.         #endif
  52.         #define   _VFAR  near   /* even in case of DS!=SS  */
  53.     #elif defined __FLAT__
  54.         #define  _VFAR
  55.     #else
  56.         #define   _VFAR  far
  57.     #endif
  58.     #if (__BORLANDC__ >= 0x450)
  59.          #define __cmf _RTLENTRY _EXPFUNC
  60.     #else
  61.          #define __cmf  _Cdecl _FARFUNC
  62.     #endif
  63. #else  /* Visual C++, Optima++ */
  64.     #define _VFAR
  65.     #define __cmf  __cdecl
  66. #endif
  67. #define _VFARC const _VFAR
  68.  
  69. /*  first the constructors:  */
  70. #ifdef __cplusplus
  71.    /* since dComplex is declared as a struct instead of a class,
  72.       the constructor cannot get the name "dComplex" here.     */
  73.   #ifndef _DCPLX_DEFINED
  74.   inline dComplex __cmf dcplx( double __ReVal )
  75.   {   dComplex Result;
  76.       Result.Re = __ReVal;
  77.       Result.Im = 0.0;
  78.       return Result;
  79.   }
  80.  
  81.       // up-conversions from single precision
  82.   inline dComplex __cmf dcplx( fComplex _VFARC & __zf )
  83.   {   dComplex Result;
  84.       Result.Re = __zf.Re;
  85.       Result.Im = __zf.Im;
  86.       return Result;
  87.   }
  88.       // down-conversion from extended precision
  89.       // (with OVERFLOW error handling):
  90.   #ifdef __BORLANDC__
  91.       dComplex __cmf dcplx( eComplex __ze );
  92.   #else
  93.       inline dComplex _VFAR & __cmf dcplx( dComplex _VFAR & __zd )
  94.       {   return __zd;  }  // necessary because eComplex=dComplex
  95.   #endif
  96.   #define _DCPLX_DEFINED
  97.   #endif  // _DCPLX_DEFINED
  98. #endif   /* basic form of constructor for C and C++ : */
  99.    dComplex __cmf dcplx( double __ReVal, double __ImVal);
  100.          /* conversion from fComplex and eComplex (with OVERFLOW handling) */
  101. #if !defined __NEWCPLX_H
  102.     #if defined __cplusplus
  103.         extern "C" {
  104.     #endif
  105.     dComplex __cmf cftocd( fComplex __zf );
  106.     dComplex __cmf cetocd( eComplex __ze );
  107.     #if defined __cplusplus
  108.         }
  109.     #endif
  110. #endif
  111.  
  112.    /* Basic complex operations. They are defined both
  113.    for C and C++. However, for C++ you may as well use the
  114.    overloaded operators and functions defined further below. */
  115. #define         cd_real( z )  (z).Re
  116. #define         cd_imag( z )  (z).Im
  117. #if defined __cplusplus && !defined _CMATH_CLASSDEFS 
  118. extern "C" {  // the following functions cannot be "extern C",
  119. #endif        // if dComplex identical to complex<double>
  120. dComplex __cmf  cd_neg(  dComplex __z );
  121. dComplex __cmf  cd_conj( dComplex __z );
  122. #ifdef __cplusplus  // even if _CMATH_CLASSDEFS
  123.     extern "C" double   __cmf  cd_norm( dComplex __z );
  124.     extern "C" double   __cmf  cd_arg(  dComplex __z );
  125. #else
  126.     double   __cmf  cd_norm( dComplex __z );
  127.     double   __cmf  cd_arg(  dComplex __z );
  128. #endif
  129. dComplex __cmf  cd_polar( double __mag, double __angle );
  130.  
  131. dComplex __cmf  cd_add(   dComplex __x, dComplex __y );
  132. dComplex __cmf  cd_addRe( dComplex __x, double __yRe );
  133. dComplex __cmf  cd_sub(   dComplex __x, dComplex __y );
  134. dComplex __cmf  cd_subRe( dComplex __x, double __yRe );  /*  x - yRe  */
  135. dComplex __cmf  cd_subrRe( dComplex __x, double __yRe ); /*  yRe - x  */
  136. dComplex __cmf  cd_mul(   dComplex __x, dComplex __y );
  137. dComplex __cmf  cd_mulRe( dComplex __x, double __yRe );
  138. dComplex __cmf  cd_div(   dComplex __x, dComplex __y );
  139. dComplex __cmf  cd_divRe( dComplex __x, double __yRe );   /*  x / yRe  */
  140. dComplex __cmf  cd_divrRe( dComplex __x, double __yRe );  /*  yRe / x  */
  141.  
  142. /*  mathematical functions with error handling through _matherr: */
  143. #ifdef __cplusplus 
  144.     extern "C" double   __cmf  cd_abs(  dComplex __z );
  145. #else
  146.     double   __cmf  cd_abs(  dComplex __z );
  147. #endif
  148. dComplex __cmf  cd_acos( dComplex __z );
  149. dComplex __cmf  cd_asin( dComplex __z );
  150. dComplex __cmf  cd_atan( dComplex __z );
  151. dComplex __cmf  cd_cos(  dComplex __z );
  152. dComplex __cmf  cd_cosh( dComplex __z );
  153. dComplex __cmf  cd_cubic( dComplex __z );  /* raise to the third power */
  154. dComplex __cmf  cd_exp(  dComplex __z );
  155. dComplex __cmf  cd_inv(  dComplex __z );    /*   1.0 / z   */
  156. dComplex __cmf  cd_ipow( dComplex __z, int __exponent );
  157.                                              /* raise z to integer power */
  158. dComplex __cmf  cd_ln(   dComplex __z );
  159. dComplex __cmf  cd_log(   dComplex __z );  /* sane as cd_ln */
  160. dComplex __cmf  cd_log2(  dComplex __z );
  161. dComplex __cmf  cd_log10( dComplex __z );
  162. dComplex __cmf  cd_pow( dComplex __base, dComplex __exponent );
  163. dComplex __cmf  cd_powReBase( double __base, dComplex __exponent ); /* power of real base */
  164. dComplex __cmf  cd_powReExpo( dComplex __base, double __exponent ); /* raise z to real power */
  165.                          /* for integer exponents, use cd_ipow ! */
  166. dComplex __cmf  cd_quartic( dComplex __z );  /* raise to the fourth power */
  167. dComplex __cmf  cd_sin(  dComplex __z );
  168. dComplex __cmf  cd_sinh( dComplex __z );
  169. dComplex __cmf  cd_square( dComplex __z );
  170. dComplex __cmf  cd_sqrt( dComplex __z );
  171. dComplex __cmf  cd_tan(  dComplex __z );
  172. dComplex __cmf  cd_tanh( dComplex __z );
  173.  
  174.  
  175. #if defined __cplusplus && !defined _CMATH_CLASSDEFS
  176. }    //  end of the extern "C" statement
  177. #endif
  178.  
  179. #if defined __cplusplus && !defined __STD_COMPLEX && !defined __COMPLEX_H && !defined __NEWCPLX_H
  180.    /* in addition to the basic operations defined above for C,
  181.       here is the same complete set of overloaded operators and
  182.       functions as offered by <newcplx.h> for the complex classes.  */
  183.  
  184.     inline double real( dComplex _VFARC & __z )
  185.     {
  186.         return __z.Re;
  187.     }
  188.  
  189.     inline double imag( dComplex _VFARC & __z )
  190.     {
  191.         return __z.Im;
  192.     }
  193.  
  194.     inline dComplex neg( dComplex _VFARC & __z1 )
  195.     {   dComplex Result;
  196.         Result.Re = -__z1.Re;
  197.         Result.Im = -__z1.Im;
  198.         return Result;
  199.     }
  200.  
  201.     inline dComplex conj( dComplex _VFARC & __z)
  202.     {   dComplex Result;
  203.         Result.Re =  __z.Re;
  204.         Result.Im = -__z.Im;
  205.         return Result;
  206.     }
  207.  
  208.     double   __cmf  norm( dComplex __z );
  209.     double   __cmf  arg(  dComplex __z );
  210.     dComplex __cmf  polar( double Mag, double Angle );
  211.  
  212.   //  unary operators:
  213.  
  214.   inline dComplex _VFAR & operator +( dComplex _VFAR & __z1 )
  215.   {
  216.       return __z1;
  217.   }
  218.  
  219.   inline dComplex operator -( dComplex _VFARC & __z1 )
  220.   {   dComplex Result;
  221.       Result.Re = -__z1.Re;
  222.       Result.Im = -__z1.Im;
  223.       return Result;
  224.   }
  225.  
  226.  
  227.   //  binary operators:
  228.  
  229.   inline dComplex operator +( dComplex _VFARC & __z1, dComplex _VFARC & __z2 )
  230.   {   dComplex Result;
  231.       Result.Re = __z1.Re + __z2.Re;
  232.       Result.Im = __z1.Im + __z2.Im;
  233.       retu